ShowTable of Contents
はじめに
JMeter は Apache プロジェクトで提供されている Web アプリケーションのパフォーマンス測定や負荷テストに使用されるツールです。Domino アプリケーション、もちろん XPages アプリケーションでも、そのテストにパワフルに使用できます。JMeter を使用しての XPages アプリケーションのテストについて、すでに Wiki 記事「JMeterを使ってXPagesアプリケーションのパフォーマンステストを行う際の考慮点」で解説されています。しかし Apache JMeter 自体が少しわかりにくいところがあるので、XPages アプリケーション開発者向けにこの記事を書きました。
JMeter は Apache のページからダウンロードできます。この執筆時の最新版である 2.11 を基にこの記事を書いています。
JMeter の使用には JRE 6.0 以降が必要です。あらかじめインストールしておきます。
JMeter のページから apache-jmeter-2.11.zip をダウンロードし、適当なフォルダに展開します。ここでは c:\ 直下に展開し C:\apache-jmeter-2.11\ が作成されたことにしています。実行時に起動フォルダにログが作成されるので。log フォルダを作ってそこで実行すると良いです。
以下のようにコマンドラインから起動します。
C:\Users\test>cd \apache-jmeter-2.11\log
C:\apache-jmeter-2.11\log>c:\apache-jmeter-2.11\bin\jmeter.bat
|
JMeter のテストを構成する部品
JMeter を最初に起動すると、すでにテスト計画とワークベンチがあります。ここにさまざま部品を追加してテストシナリオを作成します。
Jmeter のテストを構成する部品をまとめます。
カテゴリ |
エレメント名
|
|
|
テスト計画(Test Plan)
|
JMeterで実施するテストの部品をまとめるルートとなる部品
|
|
ワークベンチ(WorkBench)
|
JMeter のテスト部品を仮置きする場所。コピー&ペーストに使ったりなど目的に応じして使用できる。テスト計画を保存するときにはワークベンチは保存されないので、必要に応じて個別に保存する必要がある。 |
スレッド (Threads(Users)) |
|
|
スレッドグループ(Thread Group)
|
実行するテストケースを取りまとめたもので、テスト実行時に起動するスレッドの数で複数ユーザーからのアクセスをシュミレートする。「スレッド数」が同時アクセスユーザー数で、「Ramp-up時間」によってそれらのスレッドがすべて起動されるまでの時間を指定することができる。スレッドグループの設定で、テストを一定数行って終了するか、無限に行うかも設定できる。 |
サンプルー |
|
|
HTTPリクエスト
(HTTP Request)
|
HTTP/HTTPSのリクエストをWebサーバーに送信するサンプラーのひとつ。個々のHTTTPリクエストでプロキシサーバーにも対応している。「Embedded Resource from HTML Files」の設定で、レスポンスに含まれるHTMLをパーズし、埋め込まれたイメージやその他のリソースを取得するように設定することもできる。 |
リスナー |
|
|
結果を表で表示
(View Results in Table)
|
個々のテストサンプルの結果を1行として資格化して表示するビジュアライザーです。このビジュアライザーはメモリの消費が大きいです。
|
|
結果をツリーで表示
(View Results Tree)
|
テストサンプルの結果をツリー形式で表示するビジュアライザーです。テストサンプルに対するレスポンスとともにレスポンス時間やレスポンスコードを表示します。 |
|
応答をファイルへ保存
Save Responses to a file
|
この部品はテスト計画のどこにでも配置することができます。スコープ内のテストサンプルに対して、応答データのファイルを作成します。この部品は昨日テストを作成する際に使用されることが多く、「結果をツリーで表示」などで表示しきれない大きなレスポンスを扱うのに適しています。 |
設定エレメント |
|
|
HTTPクッキーマネージャー
|
クッキーマネージャには2つの機能があります。
ひとつはWebブラウザのようにクッキーを保持してサーバーに送信する機能です。HTTPリクエストのレスポンスにクッキーが含まれていれば、そのクッキーはクッキーマネージャによって自動的に保存され、そのWebサイトへの今後のリクエストで使用されます。JMeterのそれぞれのスレッドは独自のクッキー保持エリアを持ちます。テストをしているWeb
サイトのセッションをクッキーで保持していても、各JMeterスレッドは独立したセッションを持つことになります。
ふたつめは、クッキーマネージャに手動でクッキーの追加をすることができます。しかしこの場合は追加したクッキーがすべてのJMeterのスレッドで共有されます。
|
|
HTTP認証マネージャ |
HTTP認証マネージャによって、アクセスに認証が必要なWebページに対するログインユーザーをひとつまたは複数指定することができます。アクセスの制限されたページにブラウザからアクセスしたときには、このような認証が表示され、ブラウザはログインダイアログを表示します。JMeterではこのようなページに遭遇すると、あらかじめ用意されたログイン情報を送信します。 |
ここでは記事で使用する部品のみをリストしました。その他の部品や詳細な情報は JMeter のヘルプを参照してください。
テストシナリオ
「テスト計画」にテストシナリオを作成しながら、これらの部品の使い方を解説します。
スレッドグループ
最初に起動したときには「テスト計画」と「ワークベンチ」だけが定義されています。この「テスト計画」を右クリックし「追加」→「Threads(Users)」→「スレッドグループ」を選択して「スレッドグループ」を作成します。「スレッドグループ」はテストの実行を制御するエレメントで、複数のユーザーからのアクセスをシュミレートするために複数のスレッドを立ち上げてテストを実行することができます。
パラメータ
|
説明 |
名前(Name)
|
スレッドグループを表す名前 |
スレッド数
(Number of Threads)
|
シュミレーションするユーザー数 |
Ramp-up期間
(Ramp-up Period)
|
すべてのスレッドが開始されるまでに要する時間。もし10スレッドでRamp-up期間として100秒が指定されたときは、直前のスレッドの開始から10秒で次のスレッドが開始され、テストサンプルがすべてそろうまでに100秒かかります。 |
ループ回数(Loop Count) |
テストケースを繰り返す回数を指定します。「無限ループ」を選択することで、手動で停止するまで実行し続けます。
|
ここでは試験的に以下のよう設定をします。
|
スレッド数: |
3 |
|
Ramp-up 期間(秒): |
5 |
|
ループ回数: |
1 |
HTTPリクエスト
スレッドグループ内に実際にテストを行うHTTPリクエストを記載します。スレッドグループを右クリックして「追加」→「サンプラー」→「HTTPリクエスト」を選択し、「HTTPリクエスト」を作成します。HTTPリクエストはブラウザからの個々のリクエストを定義します。
カテゴリ |
パラメータ |
説明 |
|
名前(Name) |
このサンプラーを示す名前
|
Webサーバー |
|
|
サーバーまたはIP |
Webサーバーのドメイン名またはIPアドレス |
|
ポート |
Webサーバーが開いているポート(デフォルト:80) |
HTTPリクエスト |
|
|
プロトコル |
HTTP、HTTPSまたはFILE(デフォルト: HTTP) |
|
メソッド |
GET, POST, HEAD, TRACE, OPTIONS, PUT, DELETE, PATCH (JAVA implementationで非サポート) |
|
パス |
アクセスするリソースのパス(例:/servlets/myServlet)を指定します。リソースにURLパラメータを指定するときには「Parameter」タブの「リクエストで送るパラメータ」に指定します。
「http://」や「https://」から指定したときは完全なURLとして扱われ、「ポート」や「プロトコル」の設定値は無視されます。
|
Proxy Server |
|
|
Server (proxy) |
リクエストを処理するプロキシサーバーのホスト名やIPアドレスを指定します。「http://」などは指定しません。 |
|
Port |
プロキシサーバーでの待受けポートを指定します。 |
|
Username |
(オプション)プロキシサーバーのユーザー名 |
|
Password |
(オプション)プロキシサーバーのパスワード(この値はテスト計画に暗号化されずに保存されます)
|
ここでは試験的に以下のよう設定をします。
|
名前: |
developerWorks ページアクセス |
|
サーバー名: |
www.ibm.com |
|
メソッド: |
GET |
|
パス: |
/developerworks/jp/ |
これでテストを実施することができますが結果の表示ができません。次に実行結果を表示するリスナーを追加します。
結果を表で表示
「テスト計画」を右クリックして「リスナー」→「結果を表で表示」を選択します。「結果を表」で表示を追加したら、アクションバーから「開始」ボタンを押してテストを実行します。テストはツレッドグループの定義に従って実行されました。
3つのスレッドが起動され、それぞれ1回ずつ処理を行って終了しています。Ramp-upを3秒と指定しているので、約3秒かけてすべてのレッドが起動されました。
応答をファイルへ保存
結果を表で表示しただけでは、そのリクエストに対して正しいレスポンスが来ているかどうかわかりません。そのときは「テスト計画」を右クリックして「リスナー」→「応答をファイルへ保存」を選択します。
応答をファイルへ保存では「ファイル名の接頭辞」を指定します。これで各HTTPリクエストのレスポンスがこの接頭辞つきの連番ファイルで起動フォルダに格納されます。これはHTTPレスポンスのデータタイプによってHTMLファイルであったり画像などのバイナリファイルで保存されます。テスト計画の作成時においてはこのファイルの内容を確認して、テストが正しく実行されていることを確認します。
XPagesアプリケーションへのアクセスをテスト
次にXPagesアプリケーションへのアクセスを試してみましょう。サーバーnd90la.lotus.conにディスカッションテンプレートを使用したdiscussion.nsfがあるとします。ACLでのアクセス制限がされていなければ、先のdeveloperWorksのページへのアクセスと同様にhttp://nd90lab.lotus.com/discussion.nsfへのHTTPリクエストを作成すればアクセスはできます。しかしアクセス制御されている場合には、認証をを行う必要があります。まずDominoサーバーのDomino Webエンジンで特に設定をしていない場合、つまり基本認証の場合について紹介します。
まずHTTPリクエストがDominoアプリケーションにアクセスするために以下のように書き換えます。
|
名前: |
ディスカッションアプリ |
|
サーバー名またはIP: |
nd90lab.lotus.com |
|
パス: |
/discussion.nsf |
HTTP認証マネージャ
ACLでAnonymousのアクセス制限されているDominoアプリケーションにアクセスとすると、「エラー 401、この操作を実行する権限がありません 」が表示されます。DominoサーバーのWebエンジンが基本認証でWebページにアクセスするのであれば「HTTP認証マネージャ」で簡単に認証設定ができます。
スレッドグループを右クリックして「認証エレメント」→「HTTP認証マネージャ」を追加します。「HTTP認証マネージャ」では一番下の「追加」ボタンを押して「認証マネージャに保存されている認証」を追加し、以下の値を設定します。
|
基底URL: |
[{{http://nd90lab.lotus.com}}} |
※省略可能 |
|
ユーザー: |
admin (アプリケーションにアクセスできるユーザー) |
|
|
パスワード: |
passw0rd (ユーザーのパスワード) |
|
テスト計画を実行します。
認証マネージャが正しく設定されていれば、Domino アプリケーションへのアクセスが成功し、結果を表で表示でもStatusがSuccessで表示され、「応答をファイルへ保存」で保存されたHTMLもアプリケーションの内容を正しく表示しています。なおダウンロードされたHTMLファイルをブラウザで開くと「All Documents」ビューの文書の一覧が含まれていますが、画像などが切れていて画面が崩れていると思います。通常のブラウザではページに埋め込まれた画像・Javascript・CSSといったものを自動でダウンロードしてページを構成してくれますが、JMeterではHTTPリクエストに記載されたURLのリソースしかダウンロードしません。そのためサーバーアクセスを厳密に再現するためには、こういった部品もダウンロードするようHTTPリクエストを作成する必要があります。
セッション認証とHTTPクッキーマネージャー
Domino Webエンジンでセッション認証が有効になっているときの認証方法を見てみましょう。Domino Web エンジンで Web サイト文書のセッション認証を設定する方法はヘルプ文書に記載されています。
このときは、先ほど追加した「HTTP認証マネージャは」使用しないので削除します。認証は http://nd90lab.lotus.com/names.nsf?Login にPOSTリクエストでユーザー名とパスワードを送信することで行います。そこで先ほど追加した「ディスカッションアプリ」の直前に「HTTPリクエスト」を追加し、以下のように設定します。
|
名前: |
ログイン |
|
サーバー名またはIP: |
nd90lab.lotus.com |
|
メソッド: |
POST |
|
パス: |
/names.nsf?Login
|
|
Parameters: |
「追加」ボタンを2回押して、以下のパラメータを追加します。 |
|
username: |
admin (アプリケーションにアクセスできるユーザー) |
|
password: |
passw0rd (ユーザーのパスワード) |
この「ログイン」処理での認証情報をクッキーに保持して、次の「ディスカッションアクセス」で使用するために、「スレッドグループ」を右クリックして認証エレメント」→「HTTPクッキーマネージャ」を追加します。ここでは「HTTPクッキーマネージャ」を追加するだでけで特別な設定は必要はありません。
実際のクライアントリクエストの録画
これ以上複雑な処理をテストシナリオに直接作成するのは限界があります。そこで実際のブラウザ操作で発生するクライアントリクエストを録画してテストシナリオに取り込む仕組みがJMeterには用意されています。
「ワークベンチ」を右クリックし、「Non-Testエレメント」→「HTTPプロキシーサーバー」を追加します。「Global Settings」の「ポート」が8080になっているので、JMeterを実行しているPCでこのポートが使用されていないことを確認します。その他の設定を変更する必要はありませんが、以下の設定をすることを推奨します。
|
対象となるコントローラ: |
ワークベンチ > HTTPプロキシサーバ |
|
グループにする: |
新既コントローラへ各グループを置く |
「対象となるコントローラー」は、録画されたサンプラーがおかれる場所です。デフォルトの設定ですと「テスト計画」の中に置かれてしまい、作成中のテストしなりと混ざってしまったりして混乱する可能性があります。上記のように選択することで「ワークベンチ」の中に録画されたサンプラーが置かれます。
「グループにする」を選択することで、ブラウザからの一回のリクエストで発生する複数の「HTTP リクエスト」を「シンプルコントローラー」にまとめてkるえます。この設定をしないとすべてのサンプラーがフラットに置かれるために、後で整理するのが大変になります。
一番下の「開始」ボタンを押すとJMeterがHTTPプロキシとして動作し、経由したリクエストを記録します。Root CA Certificateに関するダイアログが出るので「OK」を押します。
ブラウザでプロキシの設定をします。Internet Explorer の場合、メニューから「ツール」→「インターネットオプション」を選択し、ダイアログで「接続」タブを開き「LAN接続設定」をクリックします。「ローカルエリアネットワーク(LAN)の設定」ダイアログで「プロキシーサーバー」セクションの「LANにプロキシサーバーを使用する」を選択し、以下の値を設定して「OK」を押してダイアログを閉じます。
|
アドレス: |
localhost |
|
ポート: |
8080 |
これでブラウザからの操作がすべてJMeterに記録されます。
以下の画面では、次の4ステップの操作を行ったときのHTTPリクエストを記録しています。
-
allDocuments.xspを開示してログイン画面の表示
-
ログイン画面での認証を経て文書一覧の表示
-
文書の一覧での文字列での検索
-
既存の文書の開示
ユーザーひとつの操作でページ自体の取得の他に、ページに埋め込まれた画像・CSS・Javascriptといったリソースの取得が行われ、複数のHTTPリクエストが発生します。先ほどのパラメータの設定でそれぞれのブラウザ操作に関連する HTTP リクエストがシンプルコントロールでグループ化されています。
ここで記録された HTTP リクエストをテストシナリオとして使うには、これらの記録されたHTTPリクエストを作成中のスレッドグループにコピーします。
XPages アプリケーション操作のためのビュー ID の保持
XPagesアプリケーションでは記録されたシナリオをそのまま使用することができますが、処理の内容によっては想定した通りの動作をしないことがあります。それはビューIDでXPagesアプリケーションの処理を管理しているためです。この問題については、以下のWiki記事に詳細が記載されています。
JMeterを使ってXPagesアプリケーションのパフォーマンステストを行う際の考慮点